#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<windows.h>
#include<math.h>


//牛客题
//int FirstNotRepeatingChar(char* str)
//{
//	int* a = (int*)calloc(52, sizeof(int));
//	for (int i = 0; i < strlen(str); ++i)
//	{
//		int num = str[i];
//		if (num > 64 && num < 91)
//		{
//			++a[num - 65];
//		}
//		if (num > 96 && num < 123)
//		{
//			++a[num - 65 - 6];
//		}
//	}
//	for (int i = 0; i < strlen(str); ++i)
//	{
//		int num = str[i];
//		if (num > 64 && num < 91)
//		{
//			if (a[num - 65] == 1)
//			{
//				return i;
//			}
//		}
//		if (num > 96 && num < 123)
//		{
//			if (a[num - 65 - 6] == 1)
//			{
//				return i;
//			}
//		}
//	}
//
//	free(a);
//	return -1;
//}

//力扣面试题01.01
//bool isUnique(char* astr) 
//{
//	int* a = (int*)calloc(52, sizeof(int));
//	for (int i = 0; i < strlen(astr); ++i)
//	{
//		int num = astr[i];
//		if (num > 64 && num < 91)
//		{
//			++a[num - 65];
//		}
//		if (num > 96 && num < 123)
//		{
//			++a[num - 65 - 6];
//		}
//	}
//	for (int i = 0; i < 52; ++i)
//	{
//		if (a[i] > 1)
//		{
//			free(a);
//			return false;
//		}
//	}
//
//	free(a);
//	return true;
//}


//力扣面试题01.02
//bool CheckPermutation(char* s1, char* s2) 
//{
//	int* a = (int*)calloc(52, sizeof(int));
//	int* b = (int*)calloc(52, sizeof(int));
//	for (int i = 0; i < strlen(s1); ++i)
//	{
//		int num = s1[i];
//		if (num > 64 && num < 91)
//		{
//			++a[num - 65];
//		}
//		if (num > 96 && num < 123)
//		{
//			++a[num - 65 - 6];
//		}
//	}
//	for (int i = 0; i < strlen(s2); ++i)
//	{
//		int num = s2[i];
//		if (num > 64 && num < 91)
//		{
//			++b[num - 65];
//		}
//		if (num > 96 && num < 123)
//		{
//			++b[num - 65 - 6];
//		}
//	}
//	for (int i = 0; i < 52; ++i)
//	{
//		if (a[i] != b[i])
//		{
//			free(a);
//			free(b);
//			return false;
//		}
//	}
//	free(a);
//	free(b);
//	return true;
//}

//力扣面试题01.04--映射法暴力破解
//bool canPermutePalindrome(char* s)
//{
//	int* a = (int*)calloc(52, sizeof(int));
//	for (int i = 0; i < strlen(s); ++i)
//	{
//		int num = s[i];
//		if (num > 64 && num < 91)
//		{
//			++a[num - 65];
//		}
//		if (num > 96 && num < 123)
//		{
//			++a[num - 65 - 6];
//		}
//	}
//	int m = 0, n = 0, t = 0;
//	bool flag = false;
//	for (int i = 0; i < 52; ++i)
//	{
//		if (a[i] == 1)
//		{
//			++m;
//			flag = true;
//		}
//		if (a[i] == 2 || a[i] % 2 == 0)
//		{
//			++n;
//			flag = true;
//		}
//		if (a[i] % 2 != 0)
//		{
//			++t;
//		}
//	}
//	if (flag && t < 2)
//	{
//		if (m <= 1)
//		{
//			free(a);
//			return true;
//		}
//		else if (m == 0 && n > 0)
//		{
//			free(a);
//			return true;
//		}
//	}
//	free(a);
//	return false;
//}


//力扣面试题01.04--映射法优化
//bool canPermutePalindrome(char* s)
//{
//	int* a = (int*)calloc(52, sizeof(int));
//	for (int i = 0; i < strlen(s); ++i)
//	{
//		int num = s[i];
//		if (num > 64 && num < 91)
//		{
//			++a[num - 65];
//		}
//		if (num > 96 && num < 123)
//		{
//			++a[num - 65 - 6];
//		}
//	}
//	int m = 0, n = 0;
//	for (int i = 0; i < 52; ++i)
//	{
//		if (a[i] == 1)//判断只有一个字母的情况(剧中回文只有一个单独的)/如果没有单独的则不是剧中回文
//		{
//			++m;
//		}
//		if (a[i] % 2 != 0)//奇数个字母的序列只能有一个，如果大于一个就不能形成回文
//		{
//			++n;
//		}
//	}
//	if (m <= 1 && n < 2)
//	{
//		free(a);
//		return true;
//	}
//	free(a);
//	return false;
//}